package com.lingchou.cloud.process.client.service;

import com.lc.common.bean.response.Result;
import com.lingchou.cloud.process.client.entity.DefinitionSupplementary;
import com.lingchou.cloud.process.client.enums.GatewayFactoryEnum;
import org.flowable.bpmn.model.*;
import org.flowable.bpmn.model.Process;
import org.flowable.task.service.impl.persistence.entity.TaskEntity;

import java.util.List;

/**
 * 流程模型service
 * @author LingChou
 */
public interface ProcessModelService {

    /**
     * 创建会签
     *
     * @param process 流程对象
     * @param id      taskId
     * @param name    taskName
     * @param collectionString 参与人集合key
     * @param completionCondition 完成条件
     * @param endTime 结束时间 ISO8601
     * @param timeServiceTaskId 定时服务任务ID
     * @return 一个可并签的userTask
     */
    UserTask createUserTaskCountersign(Process process, String id, String name, String collectionString, String completionCondition, String endTime,String timeServiceTaskId);


    /**
     * 创建并签
     *
     * @param process 流程对象
     * @param id      taskId
     * @param name    taskName
     * @param collectionString 参与人集合key
     * @param endTime 结束时间
     * @param timeServiceTaskId 定时服务任务ID
     * @return 一个可并签的userTask
     */
    UserTask createUserTaskWithSign(Process process,String id,String name,String collectionString,String endTime,String timeServiceTaskId);

    /**
     * 创建或签
     *
     * @param process 流程对象
     * @param id      taskId
     * @param name    taskName
     * @param collectionString 参与人集合key
     * @param endTime 结束时间
     * @param timeServiceTaskId 定时服务任务ID
     * @return 一个可或签的userTask
     */
    UserTask createUserTaskOrSign(Process process,String id,String name,String collectionString,String endTime,String timeServiceTaskId);


    /**
     * 创建userTask 并锁定人员
     *
     * @param process  流程对象
     * @param id       指定 id
     * @param name     指定 name
     * @param assignee 指定人员
     * @param timeServiceTaskId 定时服务任务ID
     * @return userTask对象
     */
    UserTask createAssigneeUserTask(Process process, String id, String name, String assignee,String endTime,String timeServiceTaskId);

    /**
     * 创建userTask
     *
     * @param process 流程对象
     * @param id      指定 id
     * @param name    指定 name
     * @return userTask 对象
     */
    UserTask createUserTask(Process process, String id, String name);

    /**
     * 创建连线
     *  @param process             流程对象
     * @param from                起始元素 id
     * @param to                  指向元素 id
     * @param id                  指定 id
     * @param name                指定 name
     * @param conditionExpression 条件表达式
     */
    SequenceFlow createSequenceFlow(Process process, String from, String to, String id, String name, String conditionExpression);

    /**
     * 生成网关
     *
     * @param gatewayFactoryEnum 网关工厂枚举
     * @param process            流程对象
     * @param id                 指定 id
     * @param name               指定 name
     * @return 网关对象
     */
    Gateway createGateway(GatewayFactoryEnum gatewayFactoryEnum, Process process, String id, String name);

    /**
     * 创建开始节点
     *
     * @param process 流程对象
     * @param id      指定元素 id
     * @param name    指定元素 name
     */
    StartEvent createStartEvent(Process process, String id, String name);

    /**
     * 创建结束节点
     *
     * @param process 流程对象
     * @param id      指定元素id
     * @param name    指定元素name
     * @return 结束事件对象
     */
    EndEvent createEndEvent(Process process, String id, String name);

    /**
     * 添加事件
     * @param userTask 用户任务
     */
    void addListener(UserTask userTask,String event,String implementation);

    /**
     * 创建子任务
     *
     * @param parentTask 父任务
     * @param assignee 任务责任人
     */
    TaskEntity createSubTask(TaskEntity parentTask, String assignee);

    /**
     * 创建子任务
     *
     * @param parentTask 父任务
     * @param parentTaskId 指定父任务
     * @param assignee 任务责任人
     */
    TaskEntity createSubTask(TaskEntity parentTask, String parentTaskId, String assignee);

    /**
     * 删除跳转的历史节点信息
     *
     * @param disActivityId     跳转的节点id
     * @param processInstanceId 流程实例id
     */
    void deleteActivity(String disActivityId, String processInstanceId);

    /**
     * 执行跳转
     */
    void moveExecutionsToSingleActivityId(List<String> executionIds, String activityId);

    /**
     * 任务加签
     *
     * @param taskId 任务ID
     * @param userIds 加签人
     * @param operator 当前操作人
     * @param comment 评论
     * @param flag  true向后加签  false向前加签
     */
    Result<String> addSignTask(String taskId, List<String> userIds, String operator, String comment, boolean flag);

    /**
     * 添加边界事件
     * @param attachedToRef  用户任务
     * @param endTime 结束时间 ISO8601规范
     * @return 边界事件
     */
    BoundaryEvent addBoundaryEvent(Activity attachedToRef, String endTime);

    /**
     * 添加服务任务
     * @return
     */
    ServiceTask createServiceTask(Process process, String id, String name);

    /**
     * 获取定义扩展配置参数
     * @return 定义扩展
     */
    DefinitionSupplementary queryDefinitionSupplementary(String taskDefId);
}
